package n2_两阶段终止模式;

import lombok.extern.slf4j.Slf4j;
import static utils.Sleeper.sleep;

/**
 * 两阶段终止 设计模式
 */
@Slf4j(topic = "c.T7")
public class T1_interrupt_twoPhaseTermination {

    public static void main(String[] args) {

        final TwoPhaseTermination tpt = new TwoPhaseTermination();
        // 1. 开始 监控线程
        tpt.start();

        // 2. 主线程 睡眠
        sleep(6);

        // 3. 终止 监控线程
        tpt.stop();


        // ======= 再来一次 ========
//        sleep(6);
//        log.debug("---------------- 再次开始 ----------------");
//        tpt.start();
//        sleep(6);
//        tpt.stop();
    }

}

@Slf4j(topic = "c.TwoPhaseTermination")
class TwoPhaseTermination{

    // 监控线程
    private Thread monitor;

    // 启动 监控线程
    public void start(){
        monitor = new Thread(()->{

            while (true){
                Thread current = Thread.currentThread();
                if(current.isInterrupted()){
                    log.debug("线程被打断.... 料理后事......");
                    break;
                }
                try {
                    Thread.sleep(1000);    // 1. sleep被打断抛异常 但是 interrupt会是false，所以catch需要重新设置打断为true
                    log.debug("执行监控记录。。。");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    log.debug("111重新设置打断状态前 ：{}", current.isInterrupted());
                    current.interrupt();         //  2. 重新设置打断
                    log.debug("222重新设置打断状态后：{}", current.isInterrupted());
                }
            }

        });
        monitor.start();
    }


    // 停止 监控线程
    public void stop(){
        monitor.interrupt();
    }



}
